[小ネタ] Macでgit cloneした時のタイムスタンプを修正してみた
はじめに
GitHubからgit clone
すると、cloneしたファイルのタイムスタンプはcloneした日時となります。
(GitHubのWebサイト上で見ると、〇〇 years agoや、☓☓ hours agoといった感じで最終編集日からの時間が表示されますが)
私はクラスメソッド入社以前にレガシー環境でデバッグやトラブルシュートをしていた時期があり、カジュアルに(エイリアスで)ls -lhrt
などと叩いて編集日時の情報から問題箇所のアタリをつける、といった癖があります。そのため、全てのファイルのタイムスタンプがファイルが編集された日ではなくcloneした日となることが、何となく気になっていました。
gitはタイムスタンプを考慮したバージョン管理を行っているわけではないのですが、編集した日時の情報は取得できるので、この情報を使ってcloneしたファイルのタイムスタンプを修正する簡単なbashスクリプトを作成してみました。
タイムスタンプ修正bashスクリプト
検証環境
- Mac Book Pro (13-inch,2018)
- GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
bashスクリプト
#!/bin/bash for FILE in $(git ls-files) do GIT_TIME=$(git log -1 --format=%ci $FILE | sed -e "s@.^[0-9]@@") FORMATTED=$(date -j -f "%Y-%m-%d %H:%M:%S %z" "${GIT_TIME}" +%Y%m%d%H%M.%S) touch -t "${FORMATTED}" "${FILE}" echo "${FILE} (${GIT_TIME})" done
簡単な説明
5行目:git logで取得した日時情報をsedで整形してGIT_TIMEに入れています。
6行目:7行目のtouchコマンドの書式に合わせるためdateコマンドを使って書式を変換しています。
7行目:touchコマンドでGIT_TIMEの日時に変更します。
ご注意点
- ディレクトリのタイムスタンプは変わらないです。git管理下の(gitignoreではない)ファイルが変更対象になります。
- dateのコマンドオプションの違いにより、(GNU dateの)Linux環境ですとこのままだと正しく動作しないためご注意下さい。(Mac上で動作するBSDのdateコマンドを想定しており、GNUのdate、gdateの場合はコマンドオプションが異なります。)
- 本スクリプトはdateを使っているので非root権限のアカウントで実行下さい。dateコマンドの使い方については下の記事なども参照下さい。
Man Page of DATE (GNU)
さいごに
小ネタですが、どなたかに届くと嬉しいです!